package cn.jetpiece.cloud.joss.app.modular.storage.service;

import cn.jetpiece.cloud.joss.api.object.model.params.CompleteMultiPartUploadObject;
import cn.jetpiece.cloud.joss.api.object.model.params.InitMultiPartUploadObject;
import cn.jetpiece.cloud.joss.api.object.model.params.MultiPartUploadObject;
import cn.jetpiece.cloud.joss.api.object.model.result.*;
import cn.jetpiece.cloud.joss.app.modular.basics.entity.StorageClass;
import cn.jetpiece.cloud.joss.app.modular.object.entity.Bucket;
import cn.jetpiece.cloud.joss.app.modular.object.entity.Provider;
import cn.jetpiece.cloud.joss.app.modular.object.entity.Region;
import cn.jetpiece.cloud.joss.app.modular.object.model.BucketInfo;
import cn.jetpiece.cloud.model.response.Result;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;

/**
 * 对象存储客户端
 *
 * @author XuJZ
 */
public interface JossClient {


    /**
     * 创建桶
     *
     * @param provider     桶信息
     * @param region       桶信息
     * @param bucket       桶信息
     * @param storageClass 存储类型
     */
    void createBucket(Provider provider, Region region, Bucket bucket, StorageClass storageClass);

    /**
     * 删除桶
     *
     * @param bucketInfo 桶信息
     */
    void deleteBucket(BucketInfo bucketInfo);

    /**
     * 初始化上传
     *
     * @param bucketInfo 桶信息
     * @param objectName 存储到文件服务器的全名，带后缀
     * @param param      请求信息
     * @return 上传ID
     */
    String initMultipartUpload(BucketInfo bucketInfo, String objectName, InitMultiPartUploadObject param);

    /**
     * 分片上传
     *
     * @param bucketInfo 桶信息
     * @param objectName 对象名称
     * @param param      请求信息
     * @param file       文件信息
     * @return 分片结果
     */
    JossPartEtag multipartUpload(BucketInfo bucketInfo, String objectName, MultiPartUploadObject param, MultipartFile file);

    /**
     * 合并分片上传
     *
     * @param bucketInfo 桶信息
     * @param objectName 对象名称
     * @param param      请求信息
     * @return 分片结果
     */
    UploadObjectResult completeMultipartUpload(BucketInfo bucketInfo, String objectName, CompleteMultiPartUploadObject param);

    /**
     * 上传文件
     *
     * @param bucketInfo 桶信息
     * @param acl        数据权限(1:私有,2:公共可读,3:公共读写),没传使用桶策略
     * @param objectName 存储到文件服务器的全名，带后缀
     * @param file       具体文件对象
     */
    String upload(BucketInfo bucketInfo, Integer acl, String objectName, File file);

    /**
     * 上传文件
     *
     * @param bucketInfo  桶信息
     * @param acl         数据权限(1:私有,2:公共可读,3:公共读写),没传使用桶策略
     * @param objectName  存储到文件服务器的全名，带后缀
     * @param objectSize  文件大小
     * @param contentType 文件类型
     * @param objectBytes 文件流
     */
    String upload(BucketInfo bucketInfo, Integer acl, String objectName, long objectSize, String contentType, byte[] objectBytes);

    /**
     * 上传文件
     *
     * @param bucketInfo  桶信息
     * @param acl         数据权限(1:私有,2:公共可读,3:公共读写),没传使用桶策略
     * @param objectName  存储到文件服务器的全名，带后缀
     * @param objectSize  文件大小
     * @param contentType 文件类型
     * @param inputStream 输入流
     */
    String upload(BucketInfo bucketInfo, Integer acl, String objectName, long objectSize, String contentType, InputStream inputStream);

    /**
     * 删除文件
     *
     * @param bucketInfo 桶信息
     * @param objectName 对象信息
     * @param checkAcl   是否判断权限
     */
    void delete(BucketInfo bucketInfo, String objectName, boolean checkAcl);

    /**
     * 获取对象
     *
     * @param bucketInfo 桶信息
     * @param objectName 存储到文件服务器的全名，带后缀
     * @param checkAcl   是否判断权限
     */
    void getObject(BucketInfo bucketInfo, String objectName, boolean checkAcl);

    /**
     * 销毁
     */
    void destroy();
}
